package com.gosophia.commons.ws;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;
/***
 * 配置一个适配器，将查询map的数组类型转进行转换;
 * 
 * 如果需要从WebService中向客户端返回一个map类型的数组，那么需要在自己的工程中定义一个类继承于此类，并将
 * 所定义的类标注在sei所返回map类型数组的方法上。
 * @author zhao_yanfang
 * 
 */
public class MapArrayAdapter<K, V> extends
		XmlAdapter<MapPair<K, V>, Map<K, V>[]> {
    /**
     * 将一个map类型的数组转换为一个普通的javaBean
     */
	@SuppressWarnings("unchecked")
	public MapPair<K, V> marshal(Map<K, V>[] v) throws Exception {
		MapPair<K, V> mapPair = new MapPair<K, V>();
		int size = v.length;
		int j = 0;
		MapXMLHolder<K, V>[] result = new MapXMLHolder[size];
		for (Map<K, V> map : v) {
			MapXMLHolder mapXmlHolder = new MapXMLHolder<K, V>();
			MapEnty<K, V>[] object = new MapEnty[map.size()];
			int i = 0;
			for (Map.Entry<K, V> entry : map.entrySet()) {
				MapEnty<K, V> mapDtoEntry = new MapEnty<K, V>();
				mapDtoEntry.setKey(entry.getKey());
				mapDtoEntry.setValue(entry.getValue());
				object[i] = mapDtoEntry;
				i++;
			}
			mapXmlHolder.setEntries(object);
			result[j] = mapXmlHolder;
			j++;
		}
		mapPair.setResult(result);
		return mapPair;
	}

	/**
	 * 将一个javaBean转换为map类型的数组
	 */
	@SuppressWarnings("unchecked")
	public Map<K, V>[] unmarshal(MapPair<K, V> v) throws Exception {
		Map<K, V>[] result = null;
		if (v.getResult() != null) {
			int size = v.getResult().length;
			result = new Map[size];
			int i = 0;
			Map<K, V> map = null;
			for (MapXMLHolder<K, V> list : v.getResult()) {
				map = new HashMap<K, V>();
				for (MapEnty<K, V> mapEny : list.getEntries()) {
					map.put(mapEny.getKey(), mapEny.getValue());
				}
				result[i] = map;
				i++;
			}
		}
		return result;
	}

}
